package com.spring.demo.publicutil.tree.service;


import com.spring.demo.publicutil.tree.entity.TreeNode;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * @author youjc
 * @date 2021年12月21日 11:13
 */
public class TreeService {
    /**
     * 给数据进行树状化
     * 传进来的两个参数，TreeNode要属于同一个内存地址
     * @param treeData
     * @param dataMap
     * @return 树状化 数据
     */
    public static List<TreeNode> getTreeNodes(List<TreeNode> treeData, Map<String, TreeNode> dataMap) {
        // 迭代器
        Iterator<TreeNode> iterator=treeData.iterator();
        // 循环所有的数据
        while (iterator.hasNext()) {
            TreeNode treeNode=iterator.next();
            // 如果parent不为空，则将其放入上层节点的children中
            // 将该节点放入到父节点的子节点里面
            removeNode(dataMap, iterator, treeNode);
        }
        return treeData;
    }

    /**
     * 如果节点有父节点，则保存进父节点，并删除该条数据
     * @param dataMap   数据集<节点，数据>
     * @param iterator  迭代器
     * @param treeNode  本数据
     */
    public static void removeNode(Map<String, TreeNode> dataMap, Iterator<TreeNode> iterator, TreeNode treeNode) {
        // 是否有父节点存在
        if (isEmpty(treeNode.getParent())) {
            return;
        }
        // 是否有父节点数据
        if (!dataMap.containsKey(treeNode.getParent())) {
            return;
        }
        //父节点数据
        TreeNode parent=dataMap.get(treeNode.getParent());
        //是否是叶子节点
        parent.setLeaf(false);
        //子节点数据存储空间
        if (parent.getChildren() == null) {
            parent.setChildren(new ArrayList<>());
        }
        // 添加子节点数据，因为该节点与迭代器中的该节点属于同一个内存地址所以相当于给迭代器中的该节点添加子节点
        parent.getChildren().add(treeNode);
        // 删除迭代器中该条数据
        iterator.remove();
    }



    public static boolean isEmpty(CharSequence str) {
        return str == null || str.length() == 0;
    }
}
